package com.huawei.codearts.dao;

import com.huawei.codearts.model.Member;
import com.huawei.codearts.tools.utils.JDBCUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class MemberDao {
    /**
     * 单条数据查询 带占位符式的sql
     * @return Object
     */
    public static Member getMember(String sql, Object... args) {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement ps = null;
        Member member = null;
        try {
            // 1.获取数据库的连接
            conn = JDBCUtils.getConnection();
            // 2.预编译sql语句，返回PreparedStatement的实例
            ps = conn.prepareStatement(sql);
            // 3.填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);// 小心参数声明错误！！
            }
            // 4.执行
            rs = ps.executeQuery();
            // 展开结果集数据库
            while(rs.next()) {
                // set model
                long createtime = rs.getLong("createtime");
                member = Member.fromResultSet(rs);
                member.setCreatetime(createtime);
                break;
            }
        } catch(SQLException se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        } catch(Exception e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
        } finally {

            //修改其为自动提交数据
            //主要针对于使用数据库连接池的使用
            try {
                conn.setAutoCommit(true);
            } catch (SQLException e) {
                e.printStackTrace();
            }

            // 5.资源的关闭
            JDBCUtils.releaseDb(rs, ps, conn);
        }

        return member;
    }

    /**
     * 多条数据查询
     * @return Object
     */
    public static List<Member> getMemberList() {

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<Member> dataList = new ArrayList<>();
        try {
            // 获得数据的连接
            conn = JDBCUtils.getConnection();
            // 执行查询
//            System.out.println(" 实例化Statement对...");
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT id, user, name, status, money, createtime FROM qhdzs_member where id=53 OR id=2";
            rs = stmt.executeQuery(sql);
            // 展开结果集数据库
            while(rs.next()) {
                // set model
                Member member = Member.fromResultSet(rs);
                // 时间戳
                long createtime = rs.getLong("createtime");
                // 时间戳转换成日期
//                Date date = new Date(createtime * 1000);  // 把秒转换成毫秒
//                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                String createtimeFormat = sdf.format(date);
                // set model
                member.setCreatetime(createtime);
//                member.setCreatetimeFormat(createtimeFormat);
                dataList.add(member);
            }
        } catch(SQLException se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        } catch(Exception e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
        } finally {
            // 完成后关闭
            JDBCUtils.releaseDb(rs, stmt, conn);
        }

        return dataList;
    }

    /**
     * 添加操作
     * @param user Member
     * @return boolean
     */
    public static boolean insert(Member user) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 获得数据的连接
            conn = JDBCUtils.getConnection();
            // 获得Statement对象
            stmt = conn.createStatement();
            // 执行SQL语句
            String sql = "INSERT INTO qhdzs_member(name, user, money, status, createtime) "+
                    "VALUES('"
                    + user.getName()
                    + "','"
                    + user.getUser()
                    + "','"
                    + user.getMoney()
                    + "','"
                    + user.getStatus()
                    + "','"
                    + user.getCreatetime() + "')";
            int num = stmt.executeUpdate(sql);

            // 获取生成的键 insertId
            try (ResultSet rss = stmt.getGeneratedKeys()) {
                if (rss.next()) {
                    int generatedId = rss.getInt(1);
                    System.out.println("Inserted row ID: " + generatedId);
                }
            }

            if (num > 0) {
                return true;
            }
            return false;
        } catch(SQLException se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        } catch(Exception e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
        } finally {
            JDBCUtils.releaseDb(rs, stmt, conn);
        }
        return false;
    }

    /**
     * 修改操作
     * @param user Member
     * @return boolean
     */
    public static boolean update(Member user) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 获得数据的连接
            conn = JDBCUtils.getConnection();
            // 获得Statement对象
            stmt = conn.createStatement();
            // 执行SQL语句
            String sql = "UPDATE qhdzs_member set name='" + user.getName()
                    + "',user='" + user.getUser() + "',money='"
                    + user.getMoney() + "',createtime='" + user.getCreatetime()
                    + "' WHERE id=" + user.getId();
            int num = stmt.executeUpdate(sql);
            if (num > 0) {
                return true;
            }
            return false;
        } catch(SQLException se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        } catch(Exception e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
        } finally {
            JDBCUtils.releaseDb(rs, stmt, conn);
        }
        return false;
    }

    /**
     * 删除操作
     * @param id int
     * @return boolean
     */
    public static boolean del(int id) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            // 获得数据的连接
            conn = JDBCUtils.getConnection();
            // 获得Statement对象
            stmt = conn.createStatement();
            // 执行SQL语句
            String sql = "DELETE FROM qhdzs_member WHERE id=" + id;
            int num = stmt.executeUpdate(sql);
            if (num > 0) {
                return true;
            }
            return false;
        } catch(SQLException se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        } catch(Exception e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
        } finally {
            JDBCUtils.releaseDb(rs, stmt, conn);
        }
        return false;
    }

    /**
     * 单条数据查询 带占位符式的sql 适合事务的查询方法
     * @return Object
     */
    public static Member getMemberTx(Connection conn, String sql, Object... args) {
        ResultSet rs = null;
        PreparedStatement ps = null;
        Member member = null;
        try {
            // 1.预编译sql语句，返回PreparedStatement的实例
            ps = conn.prepareStatement(sql);
            // 2.填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);// 小心参数声明错误！！
            }
            // 3.执行
            rs = ps.executeQuery();
            // 展开结果集数据库
            while(rs.next()) {
                // set model
                long createtime = rs.getLong("createtime");
                member = Member.fromResultSet(rs);
                member.setCreatetime(createtime);
                break;
            }
        } catch(SQLException se) {
            // 处理 JDBC 错误
            se.printStackTrace();
        } catch(Exception e) {
            // 处理 Class.forName 错误
            e.printStackTrace();
        } finally {
            // 4.资源的关闭
            JDBCUtils.releaseDb(rs, ps, null);
        }

        return member;
    }

    /**
     * 数据库事务
     * @return Object
     */
    public static int updateWithTx(Connection conn, String sql, Object... args) {
        PreparedStatement ps = null;
        try {
            // 1.预编译sql语句，返回PreparedStatement的实例
            ps = conn.prepareStatement(sql);
            // 2.填充占位符
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i + 1, args[i]);// 小心参数声明错误！！
            }
            // 3.执行
            return ps.executeUpdate();
        } catch(Exception e) {
            e.printStackTrace();
        } finally {
            // 4.资源的关闭
            // 因为是从外边传进来的连接，咱在这里就不要关闭了，外边造，外边关
            // 这里我们只是在里面造了一个preparedstatement，就将这个链接关了就行
            JDBCUtils.releaseDb(null, ps, null);
        }

        return 0;
    }

}
